#ifndef _EPOLL_H
#define _EPOLL_H
#include "Channel.h"
#include "Timer.h"
#include <assert.h>
#include <errno.h>
#include <memory>
#include <sys/epoll.h>
#include <vector>

namespace droneswarm
{
    /*
        Poller 类的作⽤就是负责监听⽂件描述符事件是否触发以及返回发⽣事件的⽂件描述符以及具体事件。所以⼀个
        Poller 对象对应⼀个 IO 多路复⽤模块。在 muduo 中，⼀个 EventLoop 对应⼀个 Poller 。
    */
    class Epoll
    {
    public:
        Epoll();
        ~Epoll();
        //添加事件到epoll实例中
        void epoll_add( std::shared_ptr< Channel > request, int timeout );
        //修改epoll实例中的事件
        void epoll_mod( std::shared_ptr< Channel > request, int timeout );
        //从epoll实例中删除事件
        void epoll_del( std::shared_ptr< Channel > request );
        //返回活跃的事件所属的Channel，并且将这些Channel放入一个vector中返回
        std::vector< std::shared_ptr< Channel > > poll();
        //分发处理函数
        std::vector< std::shared_ptr< Channel > > getEventsRequest( int events_num );
        void add_timer( std::shared_ptr< Channel > request_data, int timeout );
        int getEpollFd() { return epollFd_; }
        void handleExpired();

    private:
        static const int MAXFDS = 100000;
        int epollFd_;
        std::vector< struct epoll_event > events_;       //这个容器用来存放就绪事件的epoll_event结构体
        std::shared_ptr< Channel > fd2chan_[ MAXFDS ];   //这是用来存放fd和channel的映射关系
        std::shared_ptr< DdapData > fd2http_[ MAXFDS ];  //这是用来存放fd和httpdata的映射关系
        TimerManager timerManager_;
    };
}  // namespace droneswarm

#endif